<?php
class TreeNode {
    public $val = null;
    public $left = null;
    public $right = null;
    function __construct($value) {
        $this->val = $value;
    }
}

class Solution {
    /**
     @param TreeNode $root
     @return Integer[][]
     */
    function levelOrder($root) {
        if (is_null($root)) {
            return array();
        }

        // 用于暂存节点的队列，先进先出
        $queue = array();
        // 返回结果集
        $data = array();
        array_push($queue, $root);

        while (! empty($queue)) {
            // 每一层的节点
            $temp = array();
            // 每一层的节点数
            $len = count($queue);
            // 遍历queue
            for ($index=1; $index<=$len; $index++) {
                $node = $queue[$index-1];
                $temp[] = $node->val;
                // 这里已经遍历的必须unset 否则影响长度计算
                unset($queue[$index-1]);
                if ($node->left) {
                    array_push($queue, $node->left);
                }
                if ($node->right) {
                    array_push($queue, $node->right);
                }
            }
            // 将每层节点结果集放入data
            $data[] = $temp;
            // 重排索引
            $queue = array_values($queue);
        }
        return $data;
    }
}